﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CrmContacto.Contracts.Contracts.Search;

namespace Web.PuntoDeVenta.Code.FrontEnd
{
    [Serializable]
    public class TotalDeVentasManager
    {
        private const int cacheExpires = 5;

        static TotalDeVentasManager()
        {
            TotalDeVentasManager._Instance = new TotalDeVentasManager();
        }

        private TotalDeVentasManager()
        {
            CachePuntosDeVenta = new Dictionary<int, VentasPorPDV>();
        }

        private static TotalDeVentasManager _Instance = null;
        public static TotalDeVentasManager Instance
        {
            get { return _Instance; }
        }

        private Dictionary<int, VentasPorPDV> CachePuntosDeVenta;

        public VentasPorPDV GetTotales(Marca marca, int ptoVentaId)
        {
            VentasPorPDV ventasResult = null;
            DateTime now = DateTime.Now;
            if (marca != null)
            {
                bool traerActualizado = false;
                // Analizo el cache
                if (CachePuntosDeVenta.ContainsKey(ptoVentaId))
                {
                    ventasResult = (VentasPorPDV)CachePuntosDeVenta[ptoVentaId];

                    TimeSpan diff = now - ventasResult.FechaAddedToList;
                    if (diff.TotalMinutes >= cacheExpires || !ventasResult.ConValores)
                    {
                        traerActualizado = true;
                    }
                }
                else
                {
                    traerActualizado = true;
                }

                if (traerActualizado)
                {
                    ventasResult = new VentasPorPDV();
                    ventasResult.FechaAddedToList = now;
                    PdvCantidadTotalesVentaSearch search = new PdvCantidadTotalesVentaSearch();
                    search.CompanyId = marca.CompanyId;
                    search.Desde = new DateTime(now.Year, now.Month, 1);
                    search.Hasta = search.Desde.AddMonths(1).AddDays(-1);

                    var ptoVtaObj = WebServiceHelper.GetPtoVentaCodeById(ptoVentaId);
                    search.CodigoSucursal = ptoVtaObj.CodigoExterno;

                    var resultadosTotalVenta = marca.GetCantidadTotales(search);

                    if (resultadosTotalVenta.ConValores)
                    {
                        double divisor = Convert.ToDouble(resultadosTotalVenta.CantidadVentasSucursal);
                        double cociente = Convert.ToDouble(resultadosTotalVenta.CantidadVentasTotal);

                        ventasResult.ConValores = true;
                        ventasResult.CantidadSucursal = divisor;
                        ventasResult.CantidadVentasTotal = cociente;
                    }
                    else
                    {
                        ventasResult.ConValores = false;
                    }

                    if (CachePuntosDeVenta.ContainsKey(ptoVentaId))
                    {
                        CachePuntosDeVenta[ptoVentaId] = ventasResult;
                    }
                    else
                    {
                        CachePuntosDeVenta.Add(ptoVentaId, ventasResult);
                    }
                }
            }

            return ventasResult;
        }

        [Serializable]
        public class VentasPorPDV
        {
            public int PuntoDeVentaId { get; set; }

            public double CantidadSucursal { get; set; }

            public double CantidadVentasTotal { get; set; }

            public DateTime FechaAddedToList { get; set; }

            public bool ConValores { get; set; }

            public double Ratio
            {
                get
                {
                    double ratio = 0;
                    if (CantidadVentasTotal != 0)
                    {
                        ratio = (CantidadSucursal / CantidadVentasTotal) * 100;
                    }

                    return ratio;
                }
            }
        }
    }
}